🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / data / src / commonTest / kotlin / org / meshtastic / core / data / manager / PacketHandlerImplTest.kt
Displaying Raw • Download
core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/PacketHandlerImplTest.kt fix/qr-error-correction (7b45f84f) Text, 54.29 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.data.manager
Tff7b72import T7ee787dev.mokkery.MockMode
Tff7b72import T7ee787dev.mokkery.answering.calls
Tff7b72import T7ee787dev.mokkery.answering.returns
Tff7b72import T7ee787dev.mokkery.answering.throws
Tff7b72import T7ee787dev.mokkery.every
Tff7b72import T7ee787dev.mokkery.everySuspend
Tff7b72import T7ee787dev.mokkery.matcher.any
Tff7b72import T7ee787dev.mokkery.mock
Tff7b72import T7ee787dev.mokkery.verify
Tff7b72import T7ee787dev.mokkery.verify.VerifyMode.Companion.exactly
Tff7b72import T7ee787dev.mokkery.verifySuspend
Tff7b72import T7ee787io.kotest.property.Arb
Tff7b72import T7ee787io.kotest.property.arbitrary.int
Tff7b72import T7ee787io.kotest.property.checkAll
Tff7b72import T7ee787kotlinx.coroutines.CancellationException
Tff7b72import T7ee787kotlinx.coroutines.CoroutineStart
Tff7b72import T7ee787kotlinx.coroutines.async
Tff7b72import T7ee787kotlinx.coroutines.cancel
Tff7b72import T7ee787kotlinx.coroutines.cancelAndJoin
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharingStarted
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.flow.stateIn
Tff7b72import T7ee787kotlinx.coroutines.test.StandardTestDispatcher
Tff7b72import T7ee787kotlinx.coroutines.test.TestScope
Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.common.di.asServiceScope
Tff7b72import T7ee787org.meshtastic.core.common.util.nowMillis
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionEpochs
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionLifecycle
Tff7b72import T7ee787org.meshtastic.core.model.ConnectionState
Tff7b72import T7ee787org.meshtastic.core.model.DataPacket
Tff7b72import T7ee787org.meshtastic.core.model.MessageStatus
Tff7b72import T7ee787org.meshtastic.core.model.Reaction
Tff7b72import T7ee787org.meshtastic.core.repository.AwaitedSendStatus
Tff7b72import T7ee787org.meshtastic.core.repository.MeshLogRepository
Tff7b72import T7ee787org.meshtastic.core.repository.PacketRepository
Tff7b72import T7ee787org.meshtastic.core.repository.PersistedPacket
Tff7b72import T7ee787org.meshtastic.core.repository.PersistedPacketId
Tff7b72import T7ee787org.meshtastic.core.repository.PersistedReaction
Tff7b72import T7ee787org.meshtastic.core.repository.PersistedReactionId
Tff7b72import T7ee787org.meshtastic.core.repository.RadioInterfaceService
Tff7b72import T7ee787org.meshtastic.core.repository.ServiceRepository
Tff7b72import T7ee787org.meshtastic.proto.Data
Tff7b72import T7ee787org.meshtastic.proto.MeshPacket
Tff7b72import T7ee787org.meshtastic.proto.PortNum
Tff7b72import T7ee787org.meshtastic.proto.QueueStatus
Tff7b72import T7ee787org.meshtastic.proto.Routing
Tff7b72import T7ee787org.meshtastic.proto.ToRadio
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.test.AfterTest
Tff7b72import T7ee787kotlin.test.BeforeTest
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertNotNull
Tff7b72import T7ee787kotlin.test.assertTrue
Tff7b72import T7ee787kotlin.time.Duration.Companion.seconds
Tff7b72class T56d364PacketHandlerImplTest Tb4b4b4{
Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3PERSISTED_ID Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff4T79c0ff5T79c0ff6LTb4b4b4)
Tff7b72private Tff7b72val Te6edf3PERSISTED_REACTION_ID Tff7b72=
Te6edf3PersistedReactionIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3replyId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3userId Tff7b72= Ta5d6ff"Ta5d6ff!00000001Ta5d6ff"Tb4b4b4, Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3packetRepositoryTb4b4b4: Te6edf3PacketRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceService Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3meshLogRepositoryTb4b4b4: Te6edf3MeshLogRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3serviceRepositoryTb4b4b4: Te6edf3ServiceRepository Tff7b72= Te6edf3mockTb4b4b4(Te6edf3MockModeTb4b4b4.Te6edf3autofillTb4b4b4)
Tff7b72private Tff7b72val Te6edf3testDispatcher Tff7b72= Te6edf3StandardTestDispatcherTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3testScope Tff7b72= Te6edf3TestScopeTb4b4b4(Te6edf3testDispatcherTb4b4b4)
Tff7b72private Tff7b72val Te6edf3connectionStateFlow Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ConnectionStateTff7b72>Tb4b4b4(Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Tff7b72private Tff7b72val Te6edf3initialEpochs Tff7b72= Te6edf3ConnectionEpochsTb4b4b4(Te6edf3departures Tff7b72= T79c0ff7Tb4b4b4, Te6edf3lastDepartureState Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3DisconnectedTb4b4b4)
Tff7b72private Tff7b72val Te6edf3connectionLifecycleFlow Tff7b72=
Te6edf3connectionStateFlow
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3state Tff7b72-Tff7b72> Te6edf3ConnectionLifecycleTb4b4b4(Te6edf3state Tff7b72= Te6edf3stateTb4b4b4, Te6edf3epochs Tff7b72= Te6edf3initialEpochsTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3scope Tff7b72= Te6edf3testScopeTb4b4b4,
Te6edf3started Tff7b72= Te6edf3SharingStartedTb4b4b4.Te6edf3EagerlyTb4b4b4,
Te6edf3initialValue Tff7b72= Te6edf3ConnectionLifecycleTb4b4b4(Te6edf3epochs Tff7b72= Te6edf3initialEpochsTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72lateinit Tff7b72var Te6edf3handlerTb4b4b4: Te6edf3PacketHandlerImpl
Tff7b72private Tff7b72val Te6edf3responseTimeoutCrossingMillis Tff7b72= Te6edf3PacketHandlerImplTb4b4b4.Te6edf3RESPONSE_TIMEOUTTb4b4b4.Te6edf3inWholeMilliseconds Tff7b72+ T79c0ff1
Tff7b72private Tff7b72fun Td2a8ffhandlerWithScopeTb4b4b4(Te6edf3scopeTb4b4b4: Te6edf3TestScopeTb4b4b4) Tff7b72= Te6edf3PacketHandlerImplTb4b4b4(
Te6edf3lazy Tb4b4b4{ Te6edf3packetRepository Tb4b4b4}Tb4b4b4,
Te6edf3radioInterfaceServiceTb4b4b4,
Te6edf3lazy Tb4b4b4{ Te6edf3meshLogRepository Tb4b4b4}Tb4b4b4,
Te6edf3serviceRepositoryTb4b4b4,
Te6edf3scopeTb4b4b4.Te6edf3asServiceScopeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@BeforeTest
Tff7b72fun Td2a8ffsetUpTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionState Tb4b4b4} Te6edf3returns Te6edf3connectionStateFlow
Te6edf3every Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionLifecycle Tb4b4b4} Te6edf3returns Te6edf3connectionLifecycleFlow
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72true
Te6edf3handler Tff7b72= Te6edf3handlerWithScopeTb4b4b4(Te6edf3testScopeTb4b4b4)
Tb4b4b4}
Tf0883e@AfterTest
Tff7b72fun Td2a8fftearDownTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3testScopeTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fftestInitializationTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3assertNotNullTb4b4b4(Te6edf3handlerTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`sendToRadio with ToRadio sends immediately`Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3toRadio Tff7b72= Te6edf3ToRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3toRadioTb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`sendToRadio updates status using the full outgoing packet identity`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3from Tff7b72= T79c0ff0Te6edf3x11111111Tb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3x22222222Tb4b4b4,
Te6edf3id Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4,
Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3ToRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3packetTb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`sendToRadio with MeshPacket queues and sends when connected`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff4T79c0ff5T79c0ff6Tb4b4b4)
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verify Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`reconnect between ownership capture and admission rejects the stale packet`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3lifecycleFlow Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3ConnectionLifecycleTb4b4b4(Te6edf3version Tff7b72= T79c0ff1T79c0ff1Tb4b4b4, Te6edf3state Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionLifecycle Tb4b4b4} Te6edf3returns Te6edf3lifecycleFlow
Tff7b72val Te6edf3ownedHandler Tff7b72= Te6edf3handlerWithScopeTb4b4b4(Te6edf3testScopeTb4b4b4)
Tff7b72val Te6edf3capturedVersion Tff7b72= Te6edf3lifecycleFlowTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3version
Te6edf3lifecycleFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionLifecycleTb4b4b4(Te6edf3version Tff7b72= T79c0ff1T79c0ff3Tb4b4b4, Te6edf3state Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Tff7b72val Te6edf3accepted Tff7b72= Te6edf3ownedHandlerTb4b4b4.Te6edf3sendToRadioForConnectionTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff4T79c0ff6T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3capturedVersionTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3acceptedTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`reconnect while an owned packet waits in the queue prevents stale dispatch`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3lifecycleFlow Tff7b72= Te6edf3MutableStateFlowTb4b4b4(Te6edf3ConnectionLifecycleTb4b4b4(Te6edf3version Tff7b72= T79c0ff1T79c0ff1Tb4b4b4, Te6edf3state Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)Tb4b4b4)
Te6edf3every Tb4b4b4{ Te6edf3serviceRepositoryTb4b4b4.Te6edf3connectionLifecycle Tb4b4b4} Te6edf3returns Te6edf3lifecycleFlow
Tff7b72val Te6edf3ownedHandler Tff7b72= Te6edf3handlerWithScopeTb4b4b4(Te6edf3testScopeTb4b4b4)
Tff7b72val Te6edf3capturedVersion Tff7b72= Te6edf3lifecycleFlowTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3version
Te6edf3assertTrueTb4b4b4(Te6edf3ownedHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff4T79c0ff6T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3ownedHandlerTb4b4b4.Te6edf3sendToRadioForConnectionTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff4T79c0ff6T79c0ff1Tb4b4b4)Tb4b4b4, Te6edf3capturedVersionTb4b4b4)Tb4b4b4)
Te6edf3lifecycleFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionLifecycleTb4b4b4(Te6edf3version Tff7b72= T79c0ff1T79c0ff3Tb4b4b4, Te6edf3state Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3ConnectedTb4b4b4)
Te6edf3ownedHandlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff4T79c0ff6T79c0ff0Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`awaited send rejects when service scope is already stopped`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3stoppedScope Tff7b72= Te6edf3TestScopeTb4b4b4(Te6edf3StandardTestDispatcherTb4b4b4(Te6edf3testSchedulerTb4b4b4)Tb4b4b4)
Te6edf3stoppedScopeTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stoppedHandler Tff7b72= Te6edf3handlerWithScopeTb4b4b4(Te6edf3stoppedScopeTb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3stoppedHandlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff4T79c0ff5T79c0ff7Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`plain send rejects when service scope is already stopped`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3stoppedScope Tff7b72= Te6edf3TestScopeTb4b4b4(Te6edf3StandardTestDispatcherTb4b4b4(Te6edf3testSchedulerTb4b4b4)Tb4b4b4)
Te6edf3stoppedScopeTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stoppedHandler Tff7b72= Te6edf3handlerWithScopeTb4b4b4(Te6edf3stoppedScopeTb4b4b4)
Tff7b72val Te6edf3accepted Tff7b72= Te6edf3stoppedHandlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff4T79c0ff5T79c0ff9Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3acceptedTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`awaited send is released when service scope stops before worker starts`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3serviceScope Tff7b72= Te6edf3TestScopeTb4b4b4(Te6edf3StandardTestDispatcherTb4b4b4(Te6edf3testSchedulerTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3stoppedHandler Tff7b72= Te6edf3handlerWithScopeTb4b4b4(Te6edf3serviceScopeTb4b4b4)
Tff7b72val Te6edf3result Tff7b72=
Te6edf3asyncTb4b4b4(Te6edf3start Tff7b72= Te6edf3CoroutineStartTb4b4b4.Te6edf3UNDISPATCHEDTb4b4b4) Tb4b4b4{
Te6edf3stoppedHandlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff4T79c0ff5T79c0ff8Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3serviceScopeTb4b4b4.Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3completed Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3completedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3completedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleQueueStatus completes deferred`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff8T79c0ff9Tb4b4b4)
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3packetTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3status Tff7b72=
Te6edf3QueueStatusTb4b4b4(
Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff8T79c0ff9Tb4b4b4,
Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, T8b949e// Success
Te6edf3free Tff7b72= T79c0ff1Tb4b4b4,
Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3statusTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await treats ERRNO_SHOULD_RELEASE as immediate delivery success`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
T8b949e// Firmware 2.8+ returns ErrorCode 35 (ERRNO_SHOULD_RELEASE) for self-addressed packets delivered
T8b949e// through the synchronous local loopback — a success, not a queue failure.
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff0Tb4b4b4, Te6edf3res Tff7b72= T79c0ff3T79c0ff5Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await completes ERRNO_SHOULD_RELEASE even when queue is full`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
T8b949e// Regression: a self-addressed local-loopback delivery (res=35) can coincide with a full TX queue (free=0).
T8b949e// The success+full early return must not swallow it, or the response hangs until TIMEOUT (the very stall
T8b949e// this fix targets). Only the plain res=0 "accepted, now full" echo should be skipped.
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff2Tb4b4b4, Te6edf3res Tff7b72= T79c0ff3T79c0ff5Tb4b4b4, Te6edf3free Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`packet-specific accepted full queue status completes the matching queue stage`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff3Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff3Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffqueue admission must not satisfy the strict routing waiterTa5d6ff"Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff7T79c0ff9T79c0ff3Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await treats queue rejection as failure`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff1Tb4b4b4, Te6edf3res Tff7b72= T79c0ff3T79c0ff3Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3rejected Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4, Te6edf3rejectedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3rejectedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3initialEpochsTb4b4b4.Te6edf3departuresTb4b4b4, Te6edf3rejectedTb4b4b4.Te6edf3departureEpochAtDispatchTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`await response timeout starts after earlier queued packets`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff1Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
T8b949e// Let both earlier packets consume their full response windows. The awaited packet has not timed out
T8b949e// because
T8b949e// it has not reached the head of the queue yet.
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3responseTimeoutCrossingMillisTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3responseTimeoutCrossingMillisTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff0T79c0ff2Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffQueueStatus must not satisfy the strict routing waiterTa5d6ff"Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff0T79c0ff2Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`stopping the queue completes an awaiting packet still behind the backlog`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
T8b949e// Packet 803 owns the queue head, so 804 is stopped before the transport receives it.
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff4Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff3Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff4Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stopped Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3stoppedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3stoppedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`queue stop skips persistence lookup for a non-persisted packet`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3queued Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3queuedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`text emoji without reply id remains a persisted app packet`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff2Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)
Tff7b72var Te6edf3lookups Tff7b72= T79c0ff0
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3lookupsTff7b72+Tff7b72+
Tff7b72if Tb4b4b4(Te6edf3lookups Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tff7b72null Tff7b72else Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3queued Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff2Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4, Te6edf3emoji Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3PERSISTED_STATUS_RETRY_DELAYTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3queuedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2Tb4b4b4, Te6edf3lookupsTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingReactionQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`queue stop waits briefly for a persisted reaction row`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3storedReaction Tff7b72=
Te6edf3ReactionTb4b4b4(
Te6edf3replyId Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!00000001Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4,
Te6edf3timestamp Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3snr Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3rssi Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3hopsAway Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3packetId Tff7b72= T79c0ff8T79c0ff2T79c0ff5Tb4b4b4,
Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4,
Tb4b4b4)
Tff7b72var Te6edf3lookups Tff7b72= T79c0ff0
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingReactionQueueStatusTb4b4b4(T79c0ff8T79c0ff2T79c0ff5Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3lookupsTff7b72+Tff7b72+
Tff7b72if Tb4b4b4(Te6edf3lookups Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tff7b72null Tff7b72else Te6edf3PersistedReactionTb4b4b4(Te6edf3PERSISTED_REACTION_IDTb4b4b4, Te6edf3storedReactionTb4b4b4)
Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3queued Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff5Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4, Te6edf3reply_id Tff7b72= T79c0ff1Tb4b4b4, Te6edf3emoji Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3PERSISTED_STATUS_RETRY_DELAYTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3queuedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff2Tb4b4b4, Te6edf3lookupsTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingReactionQueueStatusTb4b4b4(T79c0ff8T79c0ff2T79c0ff5Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`dispatch status does not overwrite a terminal routing result`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff3Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3DELIVEREDTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff3Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff2T79c0ff3Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3SEND_ACK_TIMEOUT Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`queue stop does not overwrite a terminal routing result`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff4Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3DELIVEREDTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff0Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3queued Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff4Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3queuedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3SEND_ACK_TIMEOUT Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`stopping the queue reports an awaited packet that was already dispatched`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
T8b949e// With no backlog, packet 807 reaches the transport before stopPacketQueue() drains its response.
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff7Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff7Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stopped Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3stoppedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3stoppedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`queue stop after queue acceptance reports missing routing completion`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stopped Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3stoppedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3stoppedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`disconnect drains queued responses without restarting the processor`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3first Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff3Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3queued Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff4Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Disconnected
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff3Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3firstStopped Tff7b72= Te6edf3firstTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3firstStoppedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3firstStoppedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tff7b72val Te6edf3stopped Tff7b72= Te6edf3queuedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3stoppedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3stoppedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`missing queue status does not terminate an admitted routing waiter`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff5Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3responseTimeoutCrossingMillisTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(T79c0ff8T79c0ff0T79c0ff5Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`late queue rejection still terminates a strict waiter after confirmation timeout`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff4Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3responseTimeoutCrossingMillisTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff2T79c0ff4Tb4b4b4, Te6edf3res Tff7b72= T79c0ff3T79c0ff3Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3rejected Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4, Te6edf3rejectedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3rejectedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`missing queue status does not fail a dispatched persisted packet`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3packet Tff7b72= Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff6Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff6Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3packetTb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3responseTimeoutCrossingMillisTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tb4b4b4}
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3packetTb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`disconnected queue admission reports transport stopped`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff5Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stopped Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3stoppedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3stoppedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`disconnected fire and forget admission is rejected`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3assertFalseTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff6Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`transport refusing dispatch completes awaiting caller with failure`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns Tff7b72false
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff8Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff8Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3failed Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3SEND_FAILEDTb4b4b4, Te6edf3failedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3failedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`queue send failure completes awaiting caller with failure`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6fftest send failureTa5d6ff"Tb4b4b4)
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff6Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3failed Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3SEND_FAILEDTb4b4b4, Te6edf3failedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3failedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`queue status without a packet id does not satisfy strict routing waiters`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3first Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3second Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff0Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3firstTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffQueueStatus must not satisfy the first routing waiterTa5d6ff"Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3secondTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff0Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3secondTb4b4b4.Te6edf3isCompletedTb4b4b4, Ta5d6ff"Ta5d6ffQueueStatus must not satisfy the second routing waiterTa5d6ff"Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff2T79c0ff0Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff2T79c0ff1Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3firstTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3secondTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`queue resumes after a stop and a later send`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff2Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff2T79c0ff2Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`cancelled queue handoff releases its reservation before restarting queued work`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3storedPacket Tff7b72= Te6edf3storedTextPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff5Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3storedPacketTb4b4b4)
Tff7b72var Te6edf3sendAttempts Tff7b72= T79c0ff0
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3calls
Tb4b4b4{
Te6edf3sendAttemptsTff7b72+Tff7b72+
Tff7b72if Tb4b4b4(Te6edf3sendAttempts Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tff7b72throw Te6edf3CancellationExceptionTb4b4b4(Ta5d6ff"Ta5d6fftransport stoppedTa5d6ff"Tb4b4b4)
Tff7b72true
Tb4b4b4}
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3interrupted Tff7b72= Te6edf3async Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff5Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3queued Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3stopped Tff7b72= Te6edf3interruptedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TRANSPORT_STOPPEDTb4b4b4, Te6edf3stoppedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3stoppedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ERRORTb4b4b4) Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff6Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff1T79c0ff6Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3accepted Tff7b72= Te6edf3queuedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3acceptedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3acceptedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff5Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff3Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff5Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`awaited packet without an id is rejected before dispatch`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3REJECTEDTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffthe Boolean compatibility API must map rejectionTa5d6ff"Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`duplicate awaited packet id is rejected without replacing the original waiter`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3original Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff9Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3duplicate Tff7b72= Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff0T79c0ff9Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3REJECTEDTb4b4b4, Te6edf3duplicateTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3duplicateTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3originalTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff0T79c0ff9Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3originalTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff0T79c0ff9Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3accepted Tff7b72= Te6edf3originalTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3acceptedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3acceptedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`response received before dispatch is ignored and retains the queued id`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3queued Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3queuedTb4b4b4.Te6edf3isCompletedTb4b4b4)
Tff7b72val Te6edf3duplicate Tff7b72= Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3REJECTEDTb4b4b4, Te6edf3duplicateTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff6Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3queuedTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Tff7b72val Te6edf3accepted Tff7b72= Te6edf3queuedTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3acceptedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3acceptedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff7Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`routing rejection after dispatch completes awaited response as radio rejected`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff8Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff8Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff1T79c0ff8Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3rejected Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3RADIO_REJECTEDTb4b4b4, Te6edf3rejectedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3rejectedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`late queue status cannot replace an already completed response`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff9Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff1T79c0ff9Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff9Tb4b4b4, Te6edf3res Tff7b72= T79c0ff3T79c0ff3Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3accepted Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3acceptedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3acceptedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`cancelling an awaiting caller does not release its queued packet id`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff1Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3awaiting Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3awaitingTb4b4b4.Te6edf3cancelAndJoinTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3duplicate Tff7b72= Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3REJECTEDTb4b4b4, Te6edf3duplicateTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3duplicateTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`service owned routing expiry times out an active strict waiter`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3ROUTING_RESPONSE_TIMEOUTTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3timedOut Tff7b72= Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3TIMED_OUTTb4b4b4, Te6edf3timedOutTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3timedOutTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`cancelled strict await releases its packet id after service owned routing expiry`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3awaiting Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3awaitingTb4b4b4.Te6edf3cancelAndJoinTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3duplicate Tff7b72= Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3REJECTEDTb4b4b4, Te6edf3duplicateTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3duplicateTb4b4b4.Te6edf3dispatchedTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3ROUTING_RESPONSE_TIMEOUTTb4b4b4.Te6edf3inWholeMillisecondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3retry Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(Te6edf3dataRequestId Tff7b72= T79c0ff8T79c0ff1T79c0ff2Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3accepted Tff7b72= Te6edf3retryTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3acceptedTb4b4b4.Te6edf3statusTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3acceptedTb4b4b4.Te6edf3dispatchedTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`fire and forget rejects invalid packet ids without throwing or replacing queued work`Tb4b4b4(Tb4b4b4) Tff7b72=
Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3assertTrueTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`completed packet id can be reused by a later retry`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3assertTrueTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff1T79c0ff0Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff1T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifyTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3handlerTb4b4b4.Te6edf3stopPacketQueueTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await fails immediately while disconnected`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3testSchedulerTb4b4b4.Te6edf3currentTimeTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await fails immediately when transport send throws`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3every Tb4b4b4{ Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3trySendToRadioTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3throws Te6edf3IllegalStateExceptionTb4b4b4(Ta5d6ff"Ta5d6fftransport failedTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff7Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await does not complete on ordinary queue acceptance`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff3Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff3Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(T79c0ff7T79c0ff9T79c0ff3Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict routing wait outlives the local queue response window`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitResultTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff8T79c0ff2T79c0ff2Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff8T79c0ff2T79c0ff2Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3RESPONSE_TIMEOUT Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(T79c0ff8T79c0ff2T79c0ff2Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Te6edf3AwaitedSendStatusTb4b4b4.Te6edf3ACCEPTEDTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3statusTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await succeeds on routing ack`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff4Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff4Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(T79c0ff7T79c0ff9T79c0ff4Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`zero id synchronous loopback completes only the active queue entry`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3awaitingRoutingAck Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff8Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff8Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3awaitingRoutingAckTb4b4b4.Te6edf3isCompletedTb4b4b4)
Tff7b72val Te6edf3synchronousLoopback Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff9Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff0Tb4b4b4, Te6edf3res Tff7b72= T79c0ff3T79c0ff5Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3synchronousLoopbackTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3awaitingRoutingAckTb4b4b4.Te6edf3isCompletedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(T79c0ff7T79c0ff9T79c0ff8Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72trueTb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3awaitingRoutingAckTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`strict await fails on routing nak`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3result Tff7b72= Te6edf3async Tb4b4b4{ Te6edf3handlerTb4b4b4.Te6edf3sendToRadioAndAwaitTb4b4b4(Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff7T79c0ff9T79c0ff5Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3QueueStatusTb4b4b4(Te6edf3mesh_packet_id Tff7b72= T79c0ff7T79c0ff9T79c0ff5Tb4b4b4, Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3completeDispatchedResponseTb4b4b4(T79c0ff7T79c0ff9T79c0ff5Tb4b4b4, Te6edf3complete Tff7b72= Tff7b72falseTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3awaitTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`handleQueueStatus property test`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3checkAllTb4b4b4(Te6edf3ArbTb4b4b4.Te6edf3intTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff1T79c0ff0Tb4b4b4)Tb4b4b4, Te6edf3ArbTb4b4b4.Te6edf3intTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff3T79c0ff2Tb4b4b4)Tb4b4b4, Te6edf3ArbTb4b4b4.Te6edf3intTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff1T79c0ff0T79c0ff0T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3resTb4b4b4, Te6edf3freeTb4b4b4, Te6edf3packetId Tff7b72-Tff7b72>
Tff7b72val Te6edf3status Tff7b72= Te6edf3QueueStatusTb4b4b4(Te6edf3res Tff7b72= Te6edf3resTb4b4b4, Te6edf3free Tff7b72= Te6edf3freeTb4b4b4, Te6edf3mesh_packet_id Tff7b72= Te6edf3packetIdTb4b4b4)
T8b949e// Ensure it doesn't crash on any input
Te6edf3handlerTb4b4b4.Te6edf3handleQueueStatusTb4b4b4(Te6edf3statusTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`outgoing packets are logged with NODE_NUM_LOCAL`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3toRadio Tff7b72= Te6edf3ToRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3packetTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3toRadioTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3meshLogRepositoryTb4b4b4.Te6edf3insertTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffstoredTextPacketTb4b4b4(Te6edf3idTb4b4b4: Tffa657IntTb4b4b4, Te6edf3statusTb4b4b4: Te6edf3MessageStatusTb4b4b4) Tff7b72=
Te6edf3DataPacketTb4b4b4(Te6edf3bytes Tff7b72= Tff7b72nullTb4b4b4, Te6edf3dataType Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4.Te6edf3valueTb4b4b4, Te6edf3id Tff7b72= Te6edf3idTb4b4b4, Te6edf3status Tff7b72= Te6edf3statusTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffenrouteDataPacketTb4b4b4(Te6edf3idTb4b4b4: Tffa657IntTb4b4b4, Te6edf3timeTb4b4b4: Tffa657Long Tff7b72= T79c0ff0LTb4b4b4, Te6edf3statusTb4b4b4: Te6edf3MessageStatus Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tff7b72=
Te6edf3DataPacketTb4b4b4(Te6edf3to Tff7b72= Ta5d6ff"Ta5d6ff!12345678Ta5d6ff"Tb4b4b4, Te6edf3bytes Tff7b72= Tff7b72nullTb4b4b4, Te6edf3dataType Tff7b72= T79c0ff1Tb4b4b4, Te6edf3id Tff7b72= Te6edf3idTb4b4b4, Te6edf3time Tff7b72= Te6edf3timeTb4b4b4, Te6edf3status Tff7b72= Te6edf3statusTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffreactionTb4b4b4(Te6edf3idTb4b4b4: Tffa657IntTb4b4b4, Te6edf3timestampTb4b4b4: Tffa657Long Tff7b72= T79c0ff0LTb4b4b4, Te6edf3statusTb4b4b4: Te6edf3MessageStatus Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tff7b72= Te6edf3ReactionTb4b4b4(
Te6edf3replyId Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3user Tff7b72= Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Ta5d6ff"Ta5d6ff!00000001Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4,
Te6edf3timestamp Tff7b72= Te6edf3timestampTb4b4b4,
Te6edf3snr Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3rssi Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3hopsAway Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3packetId Tff7b72= Te6edf3idTb4b4b4,
Te6edf3status Tff7b72= Te6edf3statusTb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffoutboundDataPacketTb4b4b4(Te6edf3idTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= Te6edf3idTb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4)Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffoutboundReactionTb4b4b4(Te6edf3idTb4b4b4: Tffa657IntTb4b4b4) Tff7b72=
Te6edf3MeshPacketTb4b4b4(Te6edf3id Tff7b72= Te6edf3idTb4b4b4, Te6edf3decoded Tff7b72= Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4, Te6edf3reply_id Tff7b72= T79c0ff1Tb4b4b4, Te6edf3emoji Tff7b72= T79c0ff1Tb4b4b4)Tb4b4b4)
Tf0883e@Test
Tff7b72fun Td2a8ff`unacked ENROUTE send times out to a retryable ERROR TIMEOUT`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3enrouteDataPacketTb4b4b4(T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3ToRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3outboundDataPacketTb4b4b4(T79c0ff1T79c0ff2T79c0ff3Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3SEND_ACK_TIMEOUT Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`the timeout never fires before its deadline`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3enrouteDataPacketTb4b4b4(T79c0ff1T79c0ff2T79c0ff4Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3ToRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3outboundDataPacketTb4b4b4(T79c0ff1T79c0ff2T79c0ff4Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3SEND_ACK_TIMEOUT Tff7b72- T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`unacked ENROUTE reaction times out to a retryable ERROR TIMEOUT`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3queued Tff7b72= Te6edf3reactionTb4b4b4(Te6edf3id Tff7b72= T79c0ff1T79c0ff2T79c0ff5Tb4b4b4, Te6edf3status Tff7b72= Te6edf3MessageStatusTb4b4b4.Te6edf3QUEUEDTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingReactionQueueStatusTb4b4b4(T79c0ff1T79c0ff2T79c0ff5Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedReactionTb4b4b4(Te6edf3PERSISTED_REACTION_IDTb4b4b4, Te6edf3queuedTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3ToRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3outboundReactionTb4b4b4(T79c0ff1T79c0ff2T79c0ff5Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3SEND_ACK_TIMEOUT Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingReactionQueueStatusTb4b4b4(T79c0ff1T79c0ff2T79c0ff5Tb4b4b4, Te6edf3MessageStatusTb4b4b4.Te6edf3ENROUTETb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{
Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnrouteReactionTb4b4b4(Te6edf3PERSISTED_REACTION_IDTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`rearm times out a stale persisted ENROUTE packet after the reconnect grace`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3stale Tff7b72= Te6edf3enrouteDataPacketTb4b4b4(T79c0ff3T79c0ff2T79c0ff1Tb4b4b4, Te6edf3time Tff7b72= T79c0ff0LTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnroutePacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3listOfTb4b4b4(Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3staleTb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnrouteReactionsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3rearmSendAckTimeoutsTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3REARM_GRACE Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`rearm times out a stale persisted ENROUTE reaction after the reconnect grace`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3stale Tff7b72= Te6edf3reactionTb4b4b4(Te6edf3id Tff7b72= T79c0ff3T79c0ff2T79c0ff3Tb4b4b4, Te6edf3timestamp Tff7b72= T79c0ff0LTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnroutePacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnrouteReactionsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3listOfTb4b4b4(Te6edf3PersistedReactionTb4b4b4(Te6edf3PERSISTED_REACTION_IDTb4b4b4, Te6edf3staleTb4b4b4)Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3rearmSendAckTimeoutsTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3REARM_GRACE Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{
Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnrouteReactionTb4b4b4(Te6edf3PERSISTED_REACTION_IDTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`rearm keeps independent reaction timers when mesh packet ids collide`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3firstId Tff7b72= Te6edf3PERSISTED_REACTION_IDTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3replyId Tff7b72= T79c0ff1Tb4b4b4, Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff👍Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3secondId Tff7b72= Te6edf3PERSISTED_REACTION_IDTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3replyId Tff7b72= T79c0ff2Tb4b4b4, Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff❤️Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3first Tff7b72= Te6edf3PersistedReactionTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3reactionTb4b4b4(Te6edf3id Tff7b72= T79c0ff3T79c0ff2T79c0ff4Tb4b4b4, Te6edf3timestamp Tff7b72= T79c0ff0LTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3second Tff7b72= Te6edf3PersistedReactionTb4b4b4(Te6edf3secondIdTb4b4b4, Te6edf3reactionTb4b4b4(Te6edf3id Tff7b72= T79c0ff3T79c0ff2T79c0ff4Tb4b4b4, Te6edf3timestamp Tff7b72= T79c0ff0LTb4b4b4)Tb4b4b4.Te6edf3copyTb4b4b4(Te6edf3emoji Tff7b72= Ta5d6ff"Ta5d6ff❤️Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnroutePacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnrouteReactionsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3listOfTb4b4b4(Te6edf3firstTb4b4b4, Te6edf3secondTb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3rearmSendAckTimeoutsTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3REARM_GRACE Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnrouteReactionTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnrouteReactionTb4b4b4(Te6edf3secondIdTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`rearm gives a fresh ENROUTE packet its full ack window`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3fresh Tff7b72= Te6edf3enrouteDataPacketTb4b4b4(T79c0ff3T79c0ff2T79c0ff2Tb4b4b4, Te6edf3time Tff7b72= Te6edf3nowMillisTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnroutePacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3listOfTb4b4b4(Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3freshTb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnrouteReactionsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3rearmSendAckTimeoutsTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3REARM_GRACE Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3SEND_ACK_TIMEOUT Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`rearming supersedes the pending timer instead of stacking a second one`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
T8b949e// Repeated reconnects must not accumulate timers for the same send, and the superseded timer must not
T8b949e// fire on its own original deadline.
Te6edf3connectionStateFlowTb4b4b4.Te6edf3value Tff7b72= Te6edf3ConnectionStateTb4b4b4.Te6edf3Connected
Tff7b72val Te6edf3packet Tff7b72= Te6edf3enrouteDataPacketTb4b4b4(T79c0ff3T79c0ff2T79c0ff5Tb4b4b4, Te6edf3time Tff7b72= Te6edf3nowMillisTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3applyOutgoingQueueStatusTb4b4b4(Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3anyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4} Te6edf3returns
Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3packetTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnroutePacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3listOfTb4b4b4(Te6edf3PersistedPacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnrouteReactionsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3sendToRadioTb4b4b4(Te6edf3ToRadioTb4b4b4(Te6edf3packet Tff7b72= Te6edf3outboundDataPacketTb4b4b4(T79c0ff3T79c0ff2T79c0ff5Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3repeatTb4b4b4(T79c0ff3Tb4b4b4) Tb4b4b4{
Te6edf3handlerTb4b4b4.Te6edf3rearmSendAckTimeoutsTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3SEND_ACK_TIMEOUT Tff7b72* T79c0ff2 Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspendTb4b4b4(Te6edf3exactlyTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3PERSISTED_IDTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ff`rearm keeps independent timers for persisted rows sharing one mesh packet id`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTestTb4b4b4(Te6edf3testDispatcherTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3firstId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff4T79c0ff5T79c0ff6LTb4b4b4)
Tff7b72val Te6edf3secondId Tff7b72= Te6edf3PersistedPacketIdTb4b4b4(Te6edf3myNodeNum Tff7b72= T79c0ff1T79c0ff2T79c0ff3Tb4b4b4, Te6edf3uuid Tff7b72= T79c0ff7T79c0ff8T79c0ff9LTb4b4b4)
Tff7b72val Te6edf3first Tff7b72= Te6edf3PersistedPacketTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3enrouteDataPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff3T79c0ff2T79c0ff6Tb4b4b4, Te6edf3time Tff7b72= T79c0ff0LTb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3second Tff7b72= Te6edf3PersistedPacketTb4b4b4(Te6edf3secondIdTb4b4b4, Te6edf3enrouteDataPacketTb4b4b4(Te6edf3id Tff7b72= T79c0ff3T79c0ff2T79c0ff6Tb4b4b4, Te6edf3time Tff7b72= T79c0ff0LTb4b4b4)Tb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnroutePacketsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3listOfTb4b4b4(Te6edf3firstTb4b4b4, Te6edf3secondTb4b4b4)
Te6edf3everySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3getEnrouteReactionsTb4b4b4(Tb4b4b4) Tb4b4b4} Te6edf3returns Te6edf3emptyListTb4b4b4(Tb4b4b4)
Te6edf3handlerTb4b4b4.Te6edf3rearmSendAckTimeoutsTb4b4b4(Tb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3advanceTimeByTb4b4b4(Te6edf3PacketHandlerImplTb4b4b4.Te6edf3REARM_GRACE Tff7b72+ T79c0ff1.Te6edf3secondsTb4b4b4)
Te6edf3testSchedulerTb4b4b4.Te6edf3runCurrentTb4b4b4(Tb4b4b4)
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3firstIdTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4}
Te6edf3verifySuspend Tb4b4b4{ Te6edf3packetRepositoryTb4b4b4.Te6edf3timeOutEnroutePacketTb4b4b4(Te6edf3secondIdTb4b4b4, Te6edf3RoutingTb4b4b4.Te6edf3ErrorTb4b4b4.Te6edf3TIMEOUTTb4b4b4.Te6edf3valueTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.61s